package gui.houseeditor;

import gui.houseeditor.HouseModel.HouseObject;
import util.Casella;
import attori.sensori.Sensore;

public class Stanza {

	private String nome;
	private int temperatura;
	private int volumeIniziale;
	private int volumeAttuale;
	private HouseModel modello;
	private int rigaInizio;
	private int rigaFine;

	private int colonnaInizio;
	private int colonnaFine;

	private int rigaTemperatura;
	private int colonnaTemperatura;
	private int rigaInizioNome;
	private int colonnaInizioNome;
	
	private Sensore sensoreTemperatura;
	private Sensore sensoreVolume;


	public Stanza(String nome, int temperatura, HouseModel modello,
			int rigaInizio, int rigaFine, int colonnaInizio, int colonnaFine){
		super();
		this.nome = nome;
		this.temperatura = temperatura;
		// il volume iniziale e quello attuale all'inizializzazione sono i
		// medesimi e sono calcolati in base al modello
		this.modello = modello;
		this.rigaInizio = rigaInizio;
		this.rigaFine = rigaFine;
		this.colonnaInizio = colonnaInizio;
		this.colonnaFine = colonnaFine;
		
		this.rigaTemperatura=rigaFine-1;
		this.colonnaTemperatura=colonnaFine-2;
		this.rigaInizioNome=rigaInizio+2;
		this.colonnaInizioNome=colonnaInizio +1;
		
		inizilizeVolume();
	}

	public int getRigaTemperatura() {
		return rigaTemperatura;
	}

	public void setRigaTemperatura(int rigaTemperatura) {
		this.rigaTemperatura = rigaTemperatura;
	}

	public int getColonnaTemperatura() {
		return colonnaTemperatura;
	}

	public void setColonnaTemperatura(int colonnaTemperatura) {
		this.colonnaTemperatura = colonnaTemperatura;
	}

	public int getRigaInizioNome() {
		return rigaInizioNome;
	}

	public void setRigaInizioNome(int rigaInizioNome) {
		this.rigaInizioNome = rigaInizioNome;
	}

	public int getColonnaInizioNome() {
		return colonnaInizioNome;
	}

	public void setColonnaInizioNome(int colonnaInizioNome) {
		this.colonnaInizioNome = colonnaInizioNome;
	}
	
	public Sensore getSensoreTemperatura() {
		return sensoreTemperatura;
	}

	public void setSensoreTemperatura(Sensore sensoreTemperatura) {
		this.sensoreTemperatura = sensoreTemperatura;
	}

	public Sensore getSensoreVolume() {
		return sensoreVolume;
	}

	public void setSensoreVolume(Sensore sensoreVolume) {
		this.sensoreVolume = sensoreVolume;
	}

	private void inizilizeVolume() {
		volumeAttuale = 0;
		volumeIniziale = 0;
		for (int i = rigaInizio; i <= rigaFine; i++) {
			for (int j = colonnaInizio; j < colonnaFine; j++) {
				if (modello.getCell(i, j) != HouseObject.BLANK) {
					volumeAttuale++;
					volumeIniziale++;
				}
			}
		}
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getTemperatura() {
		return temperatura;
	}

	public void setTemperatura(int temperatura) {
		this.temperatura = temperatura;
		modello.temperaturaModificata(this);
		
	}

	public int getVolumeIniziale() {
		return volumeIniziale;
	}

	public void setVolumeIniziale(int volumeIniziale) {
		this.volumeIniziale = volumeIniziale;
	}

	public int getVolumeAttuale() {
		return volumeAttuale;
	}

	public void setVolumeAttuale(int volumeAttuale) {
		this.volumeAttuale = volumeAttuale;
	}

	public HouseModel getModello() {
		return modello;
	}

	public void setModello(HouseModel modello) {
		this.modello = modello;
	}

	public int getRigaInizio() {
		return rigaInizio;
	}

	public void setRigaInizio(int rigaInizio) {
		this.rigaInizio = rigaInizio;
	}

	public int getRigaFine() {
		return rigaFine;
	}

	public void setRigaFine(int rigaFine) {
		this.rigaFine = rigaFine;
	}

	public int getColonnaInizio() {
		return colonnaInizio;
	}

	public void setColonnaInizio(int colonnaInizio) {
		this.colonnaInizio = colonnaInizio;
	}

	public int getColonnaFine() {
		return colonnaFine;
	}

	public void setColonnaFine(int colonnaFine) {
		this.colonnaFine = colonnaFine;
	}

	public void accendiLuce() {
		for (int i = rigaInizio; i <= rigaFine; i++) {
			for (int j = colonnaInizio; j < colonnaFine; j++) {
				if (modello.getCell(i, j) == HouseObject.LAMPADINA_SPENTA) {
					modello.setCell(HouseObject.LAMPADINA_ACCESA, i, j);
				}
			}
		}
	}

	public void spegniLuce() {
		for (int i = rigaInizio; i <= rigaFine; i++) {
			for (int j = colonnaInizio; j < colonnaFine; j++) {
				if (modello.getCell(i, j) == HouseObject.LAMPADINA_ACCESA) {
					modello.setCell(HouseObject.LAMPADINA_SPENTA, i, j);
				}
			}
		}
	}
	
	public boolean contains(Casella c){
		for (int i = rigaInizio; i <= rigaFine; i++) {
			for (int j = colonnaInizio; j < colonnaFine; j++) {
				Casella fit = new Casella(i, j);
				if (fit.equals(c)) {
					return true;
				}
			}
		}	
		return false;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Stanza other = (Stanza) obj;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}
}
